package xjtu.se.articlecommunity.user.publisharticle.impl;

import com.vdurmont.emoji.EmojiParser;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import xjtu.se.articlecommunity.buser.articlemanage.dao.ArticleManageDao;
import xjtu.se.articlecommunity.user.publisharticle.PublishService;
import xjtu.se.articlecommunity.user.publisharticle.dao.ATagDao;
import xjtu.se.articlecommunity.user.publisharticle.dao.ImgDao;
import xjtu.se.articlecommunity.user.publisharticle.dao.PublishDao;
import xjtu.se.articlecommunity.user.publisharticle.dto.ImgDto;
import xjtu.se.articlecommunity.user.publisharticle.dto.ImgResultDto;
import xjtu.se.articlecommunity.user.publisharticle.dto.PublishDto;

import javax.annotation.Resource;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;

@Service
@Transactional
public class PublishServiceImpl implements PublishService {
    @Resource
    private PublishDao publishDao;

    @Resource
    private ArticleManageDao articleManageDao;

    @Resource
    private ImgDao imgDao;

    @Resource
    private ATagDao aTagDao;



    @Override
    public void publishArticle(PublishDto dto) {
        dto.setA_html(EmojiParser.parseToAliases(dto.getA_html()));
        String ID = publishDao.findMaxID(dto);
        int id=Integer.parseInt(ID)+1;
        dto.setA_id(String.valueOf(id));
        publishDao.insertArticle(dto);
        String[] tabs = dto.getTabs();
        if(tabs.length==0){

        }
        else {
            for (int i = 0; i < tabs.length; i++) {
                aTagDao.InsertArtTab(dto.getA_id(), tabs[i]);
            }
        }
    }

    @Override
    public void uploadImg(ImgDto imgDto, ImgResultDto imgResultDto, List<MultipartFile> list, PublishDto publishDto) {
        String imgAbsolutePath = "E://aimg/"; // 图片存储的本地地址 TODO: 部署

        String[] urlData = new String[5]; // 设置一次性传5张，其实一次一张就够用了，前端只用到了data[0]
        int index = 0;
        try {
            for(MultipartFile img : list) {
                //获取原始文件名，比如你上传的是　图片．jpg,则fileName＝图片．jpg
                String fileName = img.getOriginalFilename();
                if(fileName.equals("")) {
                    continue;
                }

                //为了保证文件名不一致，因此文件名称使用当前的时间戳和4位的随机数，还有原始文件名组成
                //觉得实际的企业开发不应当使用原始文件名，否则上传者使用一些不好的名字，对于下载者就不好了．
                //这里为了调试方便，可以加上．
                String finalFileName =  (new Date().getTime()) + Math.round(Math.random() * 1000)  //文件名动态部分
                        + fileName; //文件名　原始文件名

//                File pfile = new File("/aimg/"+finalFileName);
//                if(!pfile.exists()){
//                    pfile.mkdirs();
//                }
//
//                InputStream in = img.getInputStream();
//                File file = new File(pfile, finalFileName);
//                OutputStream out = new FileOutputStream(file);
//                byte[] b = new byte[10240];
//                int len = -1;//从输入流读取并放入缓存区的数据量
//
//                while ((len = in.read(b)) != -1) {
//                    out.write(b, 0, len);
//                }
//                out.flush();
//                out.close();
//                in.close();




                File newfile = new File( imgAbsolutePath + finalFileName);

                //保存文件到项目静态文件夹
                img.transferTo(newfile);

                //持久化到数据库
                //saveImg(imgDto, imgAbsolutePath + finalFileName, publishDto);

                //这里的路径是项目路径＋文件路径＋文件名称
                //这么写不是规范的做法，项目路径应是放在前端处理，只需要发送相对路径和文件名称即可，项目路径由前端加上．
                urlData[index++] = "/api/pic/" + finalFileName; // 前端的图片访问地址

                //设置异常代号
                imgResultDto.setErrno(0);
            }
            imgResultDto.setData(urlData);
            //返回Ｄto
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

    @Override
    public PublishDto getPublishedArticle(String a_id) {
        PublishDto publishDto= publishDao.getPublishedArticleByA_id(a_id);
        publishDto.setA_html(EmojiParser.parseToUnicode(publishDto.getA_html()));
        publishDto.setTabs(publishDao.getArticleTabsByA_id(a_id));
        return publishDto;
    }

    @Override
    public void rePublishArticle(PublishDto dto) {
        dto.setA_html(EmojiParser.parseToAliases(dto.getA_html()));
        articleManageDao.removeRelatedFeed(dto.getA_id());
        articleManageDao.removeTabForArticle(dto.getA_id());
        publishDao.updateArticle(dto);
        String[] tabs = dto.getTabs();
        for (int i = 0; i < tabs.length; i++) {
            aTagDao.InsertArtTab(dto.getA_id(), tabs[i]);
        }

    }

    public void saveImg(ImgDto imgDto, String path, PublishDto publishDto){
        Integer maxI_id = imgDao.findMaxID(imgDto);
        imgDto.setI_id(maxI_id + 1);
        imgDto.setI_path(path);
        imgDao.insertImg(imgDto);
    }
}
